/*
 * Configuracion.h
 *
 *  Created on: 10/09/2010
 *      Author: julfc, luciano.lattes
 */

#ifndef CONFIGURACION_H_
#define CONFIGURACION_H_

#ifndef MAX_LENGTH
#define MAX_LENGTH 256
#endif

#include <string>
#include <iostream>
#include <vector>
#include <fstream>

class Configuracion {

private:
  std::fstream archivoConfiguracion; // Referencia al archivo de configuracion.
  static const std::string PATH_ARCHIVO_CFG;

  /**
   * Escribe una cadena de caracteres al archivo en la posición del cursor.
   * Luego de escribirlo, el cursor queda en una nueva linea.
   * Si no puede escribir, arroja una excepción.
   */
  void escribirValor(const std::string& cadena);

  /**
   * Lee del archivo una cadena de caracteres a partir de la posición actual
   * del cursor y hasta:
   * El contenido leido se almacena en el parámetro "cadena".
   * Retorna true si pudo leer una linea o false en caso contrario.
   */
  bool leerLinea(std::string &cadena);

public:

  /**
   * Abre el archivo ubicado en el path predefinido del archivo de configuracion.
   * Deja el cursor al comienzo del mismo.
   * En caso de no existir el archivo, lo crea.
   * Si no puede realizar la operación, arroja una excepción
   */
  Configuracion();

  /**
   * Crea una entrada de clave=valor en el archivo de configuracion.
   */
  void crearPropiedad(const std::string& clave, const std::string& valor);

  /**
   * Retorna el valor de una propiedad dada.
   */
  std::string retornarValor(const std::string& clave);

  /**
   * Retorna las claves que contengan un identificador de grupo.
   * Ej. libspopc.server y libspopc.user son dos entradas de configuracion
   * que pertenecen al mismo grupo.
   */
  std::vector<std::string> retornarGrupoClaves(const std::string &cadena);

  /**
   * Retorna una clave del archivo de configuracion y el cursor se posiciona
   * en la siguiente propiedad.
   * Retorna true si pudo leer una clave o false en caso contrario.
   */
  bool retornarClave(std::string &cadena);

  /**
   * Elimina una entrada del archivo de configuracion.
   */
  void eliminarEntrada(const std::string& clave);

  /**
   * Limpia la configuracion destruyendo todas las entradas a continuacion
   * de una dada.
   */
  void limpiarConf(const std::string& desde);

  /**
   * Posiciona el cursor al comienzo del archivo.
   */
  void irAlPrincipio();

  /**
   * Posiciona el cursor al final del archivo.
   */
  void irAlFinal();

  /**
   * Cierra el archivo (no lo destruye físicamente)
   */
  virtual ~Configuracion();

};

#endif
